#! /usr/bin/env python
# -*- coding: utf-8 -*-
"""
/***************************************************************************
        pyArchInit Plugin  - A QGIS plugin to manage archaeological dataset
        					 stored in Postgres
                             -------------------
    begin                : 2007-12-01
    copyright            : (C) 2008 by Luca Mandolesi
    email                : mandoluca at gmail.com
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 ***************************************************************************/
"""
from sqlalchemy import Table, Column, Integer, Date, String, Text, Float, MetaData, ForeignKey, engine, create_engine, UniqueConstraint
from pyarchinit_conn_strings import *


class US_table:
	# connection string postgres"
	internal_connection = Connection()

	# create engine and metadata

	engine = create_engine(internal_connection.conn_str(), echo=False, convert_unicode = True)
	metadata = MetaData(engine)

	# define tables
	us_table = Table('us_table', metadata,
	Column('id_us', Integer, primary_key=True),
	Column('sito', Text),
	Column('area', String(4)),
	Column('us', Integer),
	Column('d_stratigrafica', String(100)),
	Column('d_interpretativa', String(100)),
	Column('descrizione', Text),
	Column('interpretazione', Text),
	Column('periodo_iniziale', String(4)),
	Column('fase_iniziale', String(4)),
	Column('periodo_finale', String(4)),
	Column('fase_finale', String(4)),
	Column('scavato', String(2)),
	Column('attivita', String(4)),
	Column('anno_scavo', String(4)),
	Column('metodo_di_scavo', String(20)),
	Column('inclusi', Text),
	Column('campioni', Text),
	Column('rapporti', Text),
	Column('data_schedatura', String(20)),
	Column('schedatore', String(25)),
	Column('formazione', String(20)),
	Column('stato_di_conservazione', String(20)),
	Column('colore', String(20)),
	Column('consistenza', String(20)),
	Column('struttura', String(30)),
	Column('cont_per', String(200)),
	Column('order_layer', Integer),
	# explicit/composite unique constraint.  'name' is optional.
    UniqueConstraint('sito', 'area', 'us', name='ID_us_unico')	
	)

	metadata.create_all(engine)

class US_table_toimp:
	# connection string postgres"
	internal_connection = Connection()

	# create engine and metadata

	engine = create_engine(internal_connection.conn_str(), echo=False, convert_unicode = True)
	metadata = MetaData(engine)

	# define tables
	us_table_toimp = Table('us_table_toimp', metadata,
	Column('id_us', Integer, primary_key=True),
	Column('sito', Text),
	Column('area', String(4)),
	Column('us', Integer),
	Column('d_stratigrafica', String(100)),
	Column('d_interpretativa', String(100)),
	Column('descrizione', Text),
	Column('interpretazione', Text),
	Column('periodo_iniziale', String(4)),
	Column('fase_iniziale', String(4)),
	Column('periodo_finale', String(4)),
	Column('fase_finale', String(4)),
	Column('scavato', String(2)),
	Column('attivita', String(4)),
	Column('anno_scavo', String(4)),
	Column('metodo_di_scavo', String(20)),
	Column('inclusi', Text),
	Column('campioni', Text),
	Column('rapporti', Text),
	Column('data_schedatura', String(20)),
	Column('schedatore', String(25)),
	Column('formazione', String(20)),
	Column('stato_di_conservazione', String(20)),
	Column('colore', String(20)),
	Column('consistenza', String(20)),
	Column('struttura', String(30)),
	Column('cont_per', Integer),

	# explicit/composite unique constraint.  'name' is optional.
    UniqueConstraint('sito', 'area', 'us', name='ID_us_unico_toimp')	
	)

	metadata.create_all(engine)

class Site_table:
	# connection string postgres"
	internal_connection = Connection()

	# create engine and metadata

	engine = create_engine(internal_connection.conn_str(), echo=False, convert_unicode = True)
	metadata = MetaData(engine)

	# define tables
	site_table = Table('site_table', metadata,
	Column('id_sito', Integer, primary_key=True),
	Column('sito', Text),
	Column('nazione', String(100)),
	Column('regione', String(100)),
	Column('comune', String(100)),
	Column('descrizione', Text),
	Column('provincia', Text),

	# explicit/composite unique constraint.  'name' is optional.
    UniqueConstraint('sito', name='ID_sito_unico')
	)

	metadata.create_all(engine)



class Periodizzazione_table:
	# connection string postgres"
	internal_connection = Connection()

	# create engine and metadata

	engine = create_engine(internal_connection.conn_str(), echo=False, convert_unicode=True)
	metadata = MetaData(engine)

	# define tables
	periodizzazione_table = Table('periodizzazione_table', metadata,
	Column('id_perfas', Integer, primary_key=True),
	Column('sito', Text),
	Column('periodo', Integer),
	Column('fase', Integer),
	Column('cron_iniziale', Integer),
	Column('cron_finale', Integer),
	Column('descrizione', Text),
	Column('datazione_estesa', String(300)),
	Column('cont_per', Integer),

	# explicit/composite unique constraint.  'name' is optional.
    UniqueConstraint('sito', 'periodo', 'fase', name='ID_perfas_unico')
	)

	metadata.create_all(engine)


class Inventario_materiali_table:
	# connection string postgres"
	internal_connection = Connection()

	# create engine and metadata

	engine = create_engine(internal_connection.conn_str(), echo=False, convert_unicode = True)
	metadata = MetaData(engine)

	# define tables
	inventario_materiali_table = Table('inventario_materiali_table', metadata,
	Column('id_invmat', Integer, primary_key=True),
	Column('sito', Text),
	Column('numero_inventario', Integer),
	Column('tipo_reperto', Text),
	Column('criterio_schedatura', Text),
	Column('definizione', Text),
	Column('descrizione', Text),
	Column('area', Integer),
	Column('us', Integer),
	Column('lavato', String(2)),
	Column('nr_cassa', Integer),
	Column('luogo_conservazione', Text),
	Column('stato_conservazione', String(20)),
	Column('datazione_reperto', String(30)),
	Column('elementi_reperto', Text),
	Column('misurazioni', Text),
	Column('rif_biblio', Text),
	Column('tecnologie', Text),
	

	# explicit/composite unique constraint.  'name' is optional.
    UniqueConstraint('sito', 'numero_inventario', name='ID_invmat_unico')
	)

	metadata.create_all(engine)


class Struttura_table:
	# connection string postgres"
	internal_connection = Connection()

	# create engine and metadata

	engine = create_engine(internal_connection.conn_str(), echo=False, convert_unicode=True)
	metadata = MetaData(engine)

	# define tables
	struttura_table = Table('struttura_table', metadata,
	Column('id_struttura', Integer, primary_key=True),
	Column('sito', Text),
	Column('sigla_struttura', Text),
	Column('numero_struttura', Integer),
	Column('categoria_struttura', Text),
	Column('tipologia_struttura', Text),
	Column('definizione_struttura', Text),
	Column('descrizione', Text),
	Column('interpretazione', Text),
	Column('periodo_iniziale', Integer),
	Column('fase_iniziale', Integer),
	Column('periodo_finale', Integer),
	Column('fase_finale', Integer),
	Column('datazione_estesa', String(300)),
	Column('materiali_impiegati', Text),
	Column('elementi_strutturali', Text),
	Column('rapporti_struttura', Text),
	Column('misure_struttura', Text),

	# explicit/composite unique constraint.  'name' is optional.
    UniqueConstraint('sito', 'sigla_struttura', 'numero_struttura', name='ID_struttura_unico')
	)

	metadata.create_all(engine)
	
class Media_table:
	# connection string postgres"
	internal_connection = Connection()

	# create engine and metadata

	engine = create_engine(internal_connection.conn_str(), echo=False, convert_unicode = True)
	metadata = MetaData(engine)

	# define tables
	media_table = Table('media_table', metadata,
	Column('id_media', Integer, primary_key=True),
	Column('mediatype', Text),
	Column('filename', Text),
	Column('filetype', String(10)),
	Column('filepath', Text),
	Column('descrizione', Text),
	Column('tags', Text),

	# explicit/composite unique constraint.  'name' is optional.
    UniqueConstraint('filepath', name='ID_media_unico')
	)

	metadata.create_all(engine)

class Media_thumb_table:
	# connection string postgres"
	internal_connection = Connection()

	# create engine and metadata

	engine = create_engine(internal_connection.conn_str(), echo=False, convert_unicode = True)
	metadata = MetaData(engine)

	# define tables
	media_thumb_table = Table('media_thumb_table', metadata,
	Column('id_media_thumb', Integer, primary_key=True),
	Column('id_media', Integer),
	Column('mediatype', Text),
	Column('media_filename', Text),
	Column('media_thumb_filename', Text),
	Column('filetype', String(10)),
	Column('filepath', Text),

	# explicit/composite unique constraint.  'name' is optional.
    UniqueConstraint('media_thumb_filename', name='ID_media_thumb_unico')
	)

	metadata.create_all(engine)

class Media_to_US_table:
	# connection string postgres"
	internal_connection = Connection()

	# create engine and metadata

	engine = create_engine(internal_connection.conn_str(), echo=False, convert_unicode = True)
	metadata = MetaData(engine)

	# define tables
	media_to_us_table = Table('media_to_us_table', metadata,
	Column('id_mediaToUs', Integer, primary_key=True),
	Column('id_us', Integer),
	Column('sito', Text),
	Column('area', String(4)),
	Column('us', Integer),
	Column('id_media', Integer),
	Column('filepath', Text),

	# explicit/composite unique constraint.  'name' is optional.
    UniqueConstraint('id_media','id_us', name='ID_mediaToUs_unico')
	)

	metadata.create_all(engine)
	

class Tafonomia_table:
	# connection string postgres"
	internal_connection = Connection()

	# create engine and metadata

	engine = create_engine(internal_connection.conn_str(), echo=False, convert_unicode = True)
	metadata = MetaData(engine)

	# define tables
	tafonomia_table = Table('tafonomia_table', metadata,
	Column('id_tafonomia', Integer, primary_key=True),
	Column('sito', Text),
	Column('nr_scheda_taf', Integer),
	Column('rito', Text),
	Column('descrizione_taf', Text),
	Column('interpretazione_taf', Text),
	Column('stato_di_conservazione', Text),
	Column('segnacoli', String(2)),
	Column('oggetti_rinvenuti_esterno', String(2)),
	Column('orientamento_asse', String(10)),
	Column('orientamento_azimut', Float(2,2)),
	Column('tipo_contenitore_resti', String(20)),
	Column('riferimenti_stratigrafici', Text),
	Column('copertura_tipo', String(20)),
	Column('id_struttura', String(5)),
	Column('corredo_si_no', String(2)),
	Column('corredo_tipo', String(20)),
	Column('corredo_descrizione', Text),
	Column('lunghezza_scheletro', Float(2,2)),
	Column('posizione_scheletro', String(15)),
	Column('posizione_cranio', String(15)),
	Column('completo_si_no', String(2)),
	Column('disturbato_si_no',  String(2)),
	Column('in_connessione_si_no',  String(2)),	
	Column('concottatura', Text),
	Column('canale_libatorio_si_no',String(2)),
	Column('frammentazione_rituale_si_no',String(2)),

	# explicit/composite unique constraint.  'name' is optional.
    UniqueConstraint('sito','nr_scheda_taf', name='ID_tafonomia_unico')
	)

	metadata.create_all(engine)



class Inventario_materiali_table_toimp:
	# connection string postgres"
	internal_connection = Connection()

	# create engine and metadata

	engine = create_engine(internal_connection.conn_str(), echo=False, convert_unicode = True)
	metadata = MetaData(engine)

	# define tables
	inventario_materiali_table_toimp = Table('inventario_materiali_table_toimp', metadata,
	Column('id_invmat', Integer, primary_key=True),
	Column('sito', Text),
	Column('numero_inventario', Integer),
	Column('tipo_reperto', Text),
	Column('criterio_schedatura', Text),
	Column('definizione', Text),
	Column('descrizione', Text),
	Column('area', Integer),
	Column('us', Integer),
	Column('lavato', String(2)),
	Column('nr_cassa', Integer),
	Column('luogo_conservazione', Text),

	# explicit/composite unique constraint.  'name' is optional.
    UniqueConstraint('sito', 'numero_inventario', name='ID_invmat_unico_toimp')
	)

	metadata.create_all(engine)